package migrator

import (
	"context"
	"sync"

	"github.com/xiaoxuxiansheng/xtimer/pkg/log"
	service "github.com/xiaoxuxiansheng/xtimer/service/migrator"
)

// 定期从 timer 表中加载一系列 task 记录添加到 task 表中
type MigratorApp struct {
	sync.Once                 // go中的一种同步原语，确保某个操作或函数在并发环境下只被执行一次，只有一个导出方法：Do, 该方法接收一个函数参数。在Do方法被调用后，该函数被执行，且只会执行一次
	ctx       context.Context // go context: 用于在不同的goroutine之间传递请求域的相关数据，并可以用来控制goroutine的声明周期和取消操作
	stop      func()
	worker    *service.Worker // 导入migrator的具体实现：
}

func NewMigratorApp(worker *service.Worker) *MigratorApp {
	m := MigratorApp{
		worker: worker,
	}

	m.ctx, m.stop = context.WithCancel(context.Background())
	return &m
}

func (m *MigratorApp) Start() {
	m.Do(func() { // Do 执行sync.Once 单次执行
		log.InfoContext(m.ctx, "migrator is starting")
		go func() {
			if err := m.worker.Start(m.ctx); err != nil {
				log.ErrorContextf(m.ctx, "start worker failed, err: %v", err)
			}
		}()
	})
}

func (m *MigratorApp) Stop() {
	m.stop()
}
